package com.caption.jdk.stream;

import com.caption.jdk.lambda.Person;
import com.caption.jdk.lambda.Student;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * stream方法:
 * forEach、count、filter、limit、skip、map、sorts、distinct
 */
public class TestStream02 {

    public static void main(String[] args) {
        /**
         * 1.forEach 遍历元素，属于终结方法，不会继续链式调用
         */
        //  Stream.of("a","b","c").forEach(s-> System.out.println(s));
        /**
         *2.count   统计元素个数， 属于终结调用，不会继续链式调用
         */
        Long count = Stream.of("a", "c").count();
        System.out.println(count);
        /**
         * 3.filter 方法用来过滤符合元素，返回的式符合类型的stream 可以继续链式调用
         */
        Stream.of("a1", "a2", "a3").filter(s -> s.equals("a2")).forEach(s -> System.out.println(s));
        /**
         * 4.limit 对流进行截取，只取前n个元素
         */
        Stream.of("b1", "b2", "b3").limit(1).forEach(System.out::println);
        /**
         * 5.skip方法,跳过前n个元素,进行截取
         */
        Stream.of("c1", "c2", "c3").skip(2).forEach(System.out::println);

        /**
         * 6. map 对元素进行转换,例如 list<Person>转换为List <String>
         */
        List<Person> list = new ArrayList<>();
        list.add(new Person("张三", 30));
        list.add(new Person("李四", 20));
        list.add(new Person("王五", 25));
        list.add(new Person("小六",25));
        List<String> nameList = list.stream().map(p -> p.getName()).collect(Collectors.toList());
        System.out.println(nameList);
        /**
         * 7.sorts 对元素进行排序
         */
        List<Person> sortList = list.stream().sorted((o1, o2) -> o2.getAge() - o1.getAge()).collect(Collectors.toList());
        System.out.println(sortList);
        /**
         * 8.distinct去掉重复数据,  注意distinct去重是按照比较元素的equals和hashCode方法是否相等,所以当需要按照
         * 指定的规则进行过滤时需要重新对象的equals 和 hashCode方法
         */
        List<Student> studentList = Arrays.asList(new Student("张三",20),
                new Student("李四",25),
                new Student("王五",30),
                new Student("张三",20)
                );
        //当没有重写 equals 和 hashCode方法时 distinct 不能按照名字和年龄是否相同去掉重复数据,这种方式需要慎用
        List<Student>  distinctList =  studentList.stream().distinct().collect(Collectors.toList());
        System.out.println(distinctList);


    }
}
